#include "stdafx.h"
#include "Strategy.h"

#include "jugadores.h"
#include "log.h"

char myMessage[200];

bool correction = false;
double correction_x = 0;
double correction_y = 0;

Equipo equipo = Inicial;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}

extern "C" STRATEGY_API void Create ( Environment *env )
{
    correction = false;
	env->userData = (void*) new DICT();

	sprintf(myMessage, " ");
	env->display = myMessage;
}

// --------------------------------------------------------------------------------------------

extern "C" STRATEGY_API void Destroy ( Environment *env )
{
	if(env->userData != NULL) {
		delete (DICT*) env->userData;
	}
}

// --------------------------------------------------------------------------------------------

extern "C" STRATEGY_API void Strategy ( Environment *env )
{
	if(equipo == Inicial)
	{
		if(env->home[0].pos.x < MITAD_DE_CANCHA_EN_X)
		{
			equipo = Local; //Equipo Amarillo
		}
		else
		{
			equipo = Visitante; //Equipo Azul
		}
	}

    if(correction == false) {

		if(env->gameState != PENALTY_KICK) {
			correction_x = MITAD_DE_CANCHA_EN_X - (env->currentBall.pos.x);
			correction_y = MITAD_DE_CANCHA_EN_Y - (env->currentBall.pos.y);

			env->lastBall.pos.x = env->currentBall.pos.x;
			env->lastBall.pos.y = env->currentBall.pos.y;

			Log("general", "Pelota", env->currentBall.pos.x, env->currentBall.pos.y, correction_x, correction_y);

			env->predictedBall.pos.x = env->currentBall.pos.x + correction_x;
			env->predictedBall.pos.y = env->currentBall.pos.y + correction_y;
		}

        correction = true;
    }
    else {
        PredictBall (env, correction_x, correction_y);
    }

	switch (env->gameState)
	{
	case PLAY:
		PlayNormal(env, equipo);
		break;
	case FREE_BALL:
		PlayNormal(env, equipo);
		break;
	case PLACE_KICK:
		PlayNormal(env, equipo);
		break;
	case PENALTY_KICK:
		switch (env->whosBall)
		{
		case ANYONES_BALL:
			PlayPenal(env, equipo);
			break;
		case BLUE_BALL:
			PlayPenal(env, equipo);
			break;
		case YELLOW_BALL:
			PlayPenal(env, equipo);
			break;
		}
		break;
	case FREE_KICK:
		switch (env->whosBall)
		{
		case ANYONES_BALL:
			PlayNormal(env, equipo);
			break;
		case BLUE_BALL:
			PlayNormal(env, equipo);
			break;
		case YELLOW_BALL:
			PlayNormal(env, equipo);
			break;
		}
		break;
	case GOAL_KICK:
		switch (env->whosBall)
		{
		case ANYONES_BALL:
			PlayNormal(env, equipo);
			break;
		case BLUE_BALL:
			PlayNormal(env, equipo);
			break;
		case YELLOW_BALL:
			PlayNormal(env, equipo);
			break;
		}
		break;
	}

	env->lastBall.pos.x = env->currentBall.pos.x;
	env->lastBall.pos.y = env->currentBall.pos.y;
}

//------------------------------------------------------------------------------------------------

// =====================================================================
// JUGADAS
// =====================================================================

void PlayNormal( Environment *env, Equipo equipo )
{
	int masCerca,i;
	double distMin,dist;

	masCerca = 1;
	distMin = Distancia(
		env->home[1].pos.x,
		env->home[1].pos.y,
		env->predictedBall.pos.x,
		env->predictedBall.pos.y);

	for(i=2; i<5; i++)
	{
		dist = Distancia(env->home[i].pos.x,env->home[i].pos.y,env->predictedBall.pos.x,env->predictedBall.pos.y);
		if (dist < distMin)
		{
			masCerca = i;
			distMin = dist;
		}
	}

	Arquero(&env->home[0], env, equipo );
	Defensor(&env->home[1], env, 1, (masCerca == 1) );
	Defensor(&env->home[2], env, 2, (masCerca == 2) );
	Delantero(&env->home[3], env, 3, (masCerca == 3) );
	Delantero(&env->home[4], env, 4, (masCerca == 4) );
}

void PlayPenal( Environment *env, Equipo equipo )
{

	ArqueroPenal(&env->home[0], env, equipo );
	DefensorPenal(&env->home[1], env, 1, equipo);
	DefensorPenal(&env->home[2], env, 2, equipo);
	DelanteroPenal(&env->home[3], env, 3, equipo );
	DelanteroPenal(&env->home[4], env, 4, equipo );
}


